package com.controladores.controlvehicular;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

import com.controladores.modelo.RegistroControlVehiculo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.DatePicker;
import android.widget.TimePicker;

public class GestorBaseDatos extends SQLiteOpenHelper {

	// La carpeta por defecto donde Android espera encontrar la Base de Datos de
	// tu aplicacion
	private static String DB_PATH = "/data/data/com.controladores.controlvehicular/databases/";
	private static String DB_NAME = "SIMERT";
	private SQLiteDatabase myDataBase;
	private final Context myContext;

	/*
	 * Constructor
	 * 
	 * Guarda una referencia al contexto para acceder a la carpeta assets de la
	 * aplicacion y a los recursos
	 * 
	 * @param contexto
	 */
	public GestorBaseDatos(Context contexto) {

		super(contexto, DB_NAME, null, 1);
		this.myContext = contexto;
	}

	/*
	 * Crea una base de datos vacia en el sistema y la sobreescribe con la que
	 * hemos puesto en Assets
	 */
	public void crearDataBase() throws IOException {

		boolean dbExist = comprobarBaseDatos();

		if (dbExist) {
			// Si ya existe no hacemos nada
		} else {
			// Si no existe, creamos una nueva Base de datos en la carpeta por
			// defecto de nuestra aplicacion,
			// de esta forma el Sistema nos permitira sobreescribirla con la que
			// tenemos en la carpeta Assets
			this.getReadableDatabase();
			try {
				copiarBaseDatos();
			} catch (IOException e) {
				throw new Error("Error al copiar la Base de Datos");
			}
		}
	}

	/*
	 * Comprobamos si la base de datos existe
	 * 
	 * @return true si existe, false en otro caso
	 */
	private boolean comprobarBaseDatos() {
		SQLiteDatabase checkDB = null;
		try {
			String myPath = DB_PATH + DB_NAME;
			checkDB = SQLiteDatabase.openDatabase(myPath, null,
					SQLiteDatabase.OPEN_READONLY);
		} catch (SQLiteException e) {
			// No existe
		}

		if (checkDB != null) {
			checkDB.close();
		}

		return checkDB != null ? true : false;
	}

	/*
	 * Copia la base de datos desde la carpeta Assets sobre la base de datos
	 * vacia recion creada en la carpeta del sistema, desde donde es accesible
	 */
	private void copiarBaseDatos() throws IOException {

		// Abrimos la BBDD de la carpeta Assets como un InputStream
		InputStream myInput = myContext.getAssets().open(DB_NAME);

		// Carpeta de destino (donde hemos creado la BBDD vacia)
		String outFileName = DB_PATH + DB_NAME;

		// Abrimos la BBDD vacia como OutputStream
		OutputStream myOutput = new FileOutputStream(outFileName);

		// Transfiere los Bytes entre el Stream de entrada y el de Salida
		byte[] buffer = new byte[1024];
		int length;
		while ((length = myInput.read(buffer)) > 0) {
			myOutput.write(buffer, 0, length);
		}

		// Cerramos los ficheros abiertos
		myOutput.flush();
		myOutput.close();
		myInput.close();
	}

	/*
	 * Abre la base de datos
	 */
	public void abrirBaseDatos() throws SQLException {
		String myPath = DB_PATH + DB_NAME;
		myDataBase = SQLiteDatabase.openDatabase(myPath, null,
				SQLiteDatabase.OPEN_READWRITE);

	}

	/*
	 * Cierra la base de datos
	 */
	@Override
	public synchronized void close() {
		if (myDataBase != null)
			myDataBase.close();

		super.close();
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// No usamos este metodo
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// No usamos este metodo
	}

	// Podemos anadir metodos publicos que accedan al contenido de la base de
	// datos,
	// para realizar consultas, u operaciones CRUD (create, read, update,
	// delete)

	private final String TABLE_REGISTROCONTROLVEHICULO = "RegistroControlVehiculo";
	private final String TABLE_REGISTROCONTROLRECARGA = "RegistroControlRecarga";
	private final String TABLE_KEY_IDREGISTROCONTROLVEHICULO = "idRegistroControlVehiculo";
	//private final String TABLE_KEY_IDREGISTROCONTROLRECARGA = "idRegistroControlRecarga";
	private final String TABLE_KEY_FECHA = "fecha";
	private final String TABLE_KEY_HORACONTROL = "horaControl";
	private final String TABLE_KEY_COLOR = "color";
	private final String TABLE_KEY_PLACA = "placa";
	private final String TABLE_KEY_MARCA = "marca";
	private final String TABLE_KEY_FECHARECARGA = "fecha";
	private final String TABLE_KEY_HORACONTROLRECARGA = "horaControl";
	private final String TABLE_KEY_COLORRECARGA = "color";
	private final String TABLE_KEY_PLACARECARGA = "placa";
	private final String TABLE_KEY_MARCARECARGA = "marca";
	
	private final String TABLE_KEY_CODIGO = "codigo";
	

	/*
	 * 
	 */

	public ArrayList<RegistroControlVehiculo> GetRegistrosVehiculos() {
		ArrayList<RegistroControlVehiculo> listaRegistroVehiculos = new ArrayList<RegistroControlVehiculo>();

		Cursor c = myDataBase.query(TABLE_REGISTROCONTROLVEHICULO, new String[] { TABLE_KEY_IDREGISTROCONTROLVEHICULO, TABLE_KEY_FECHA,
				TABLE_KEY_HORACONTROL,TABLE_KEY_COLOR, TABLE_KEY_PLACA, TABLE_KEY_MARCA}, null, null, null, null,
				null);
		

		// Iteramos a traves de los registros del cursor
		c.moveToFirst();
		while (c.isAfterLast() == false) {
			RegistroControlVehiculo v = new RegistroControlVehiculo();
			//v.setTitulo(c.getString(1));
			//v.setAutor(c.getString(2));
			listaRegistroVehiculos.add(v);
			c.moveToNext();
		}
		c.close();

		return listaRegistroVehiculos;
	}

	public boolean InsertVehiculos(String placa, String color, String marca, String horaControl, String fechacontrol) {
		// Preparamos los valores que vamos a insertar
		ContentValues cv = new ContentValues();
		cv.put(TABLE_KEY_FECHA, fechacontrol);
		cv.put(TABLE_KEY_HORACONTROL, horaControl);
		cv.put(TABLE_KEY_COLOR, color);
		cv.put(TABLE_KEY_PLACA, placa);
		cv.put(TABLE_KEY_MARCA, marca);

		// Realizamos la consulta
		long rowid = myDataBase.insert(TABLE_REGISTROCONTROLVEHICULO, null, cv);

		return rowid >= 0;
	}

	public boolean InsertVehiculosRecargas(String placa, String color,
			String marca, String horaControl, String fechacontrol,
			String codigoR) {
		ContentValues cvR = new ContentValues();
		cvR.put(TABLE_KEY_FECHARECARGA, fechacontrol);
		cvR.put(TABLE_KEY_HORACONTROLRECARGA, horaControl);
		cvR.put(TABLE_KEY_COLORRECARGA, color);
		cvR.put(TABLE_KEY_PLACARECARGA, placa);
		cvR.put(TABLE_KEY_MARCARECARGA, marca);
		cvR.put(TABLE_KEY_CODIGO, codigoR);
		
		long rowidRECARGAS = myDataBase.insert(TABLE_REGISTROCONTROLRECARGA, null, cvR);
		// TODO Auto-generated method stub
		return rowidRECARGAS >= 0;
	}
}
